#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

//定义sever类型
typedef websocketpp::server<websocketpp::config::asio> server_t;

void onOpen(websocketpp::connection_hdl hdl)
{
    std::cout << "onOpen连接成功" << std::endl;
}
void onClose(websocketpp::connection_hdl hdl)
{
    std::cout << "onClose连接关闭" << std::endl;
}
void onMessage(server_t *server, websocketpp::connection_hdl hdl, server_t::message_ptr msg)
{
    //1. 获取有效消息载荷 进行业务处理
    std::string body = msg->get_payload();
    std::cout << "收到消息:" << msg->get_payload().c_str() << std::endl;
    //2. 对客户端进性响应
    //获取通信连接
    auto conn = server->get_con_from_hdl(hdl); // weak_ptr connection_hdl
    //发送数据
    conn->send(std::string(body + "-echo"), websocketpp::frame::opcode::value::text);
}
int main()
{
    // 实例化服务器对象
    server_t server;
    //1.初始化日志输出---关闭日志输出
    server.set_access_channels(websocketpp::log::alevel::none); 

    //2.初始化asio框架
    server.init_asio();
    
    //3，设置消息处理/连接握手成功/连接关闭回调函数
    server.set_open_handler(onOpen);
    server.set_close_handler(onClose);
    //适配
    auto meg_hdler = std::bind(onMessage, &server, std::placeholders::_1, std::placeholders::_2);
    server.set_message_handler(meg_hdler);
    // 启用地址重用
    server.set_reuse_addr(true);
    //4.设置监听端口
    server.listen(9090);
    //5.开始监听
    server.start_accept();
    //6.启动服务器
    server.run();
    return 0;
}
